// comma inserts commas in a non-negative decimal integer string.
package main

import (
	"bytes"
	"fmt"
	"strings"
)

func main() {
	fmt.Println(comma("1234567890"))
	fmt.Println(comma1("1234567890"))
	fmt.Println(comma1("123456789"))
	fmt.Println(comma1("1.2345678"))
	fmt.Println(comma2("1.2345678"))
	fmt.Println(isShuffled("1234567890", "1234567809"))
	fmt.Println(isShuffled("1234567890", "124567809"))
}

func comma(s string) string {
	n := len(s)
	if n <= 3 {
		return s
	}
	return comma(s[:n-3]) + "," + s[n-3:]
}

// 练习 3.10: 编写一个非递归版本的comma函数，使用bytes.Buffer代替字符串链接操作。
func comma1(s string) string {
	var buf bytes.Buffer
	n := len(s)
	if n <= 3 {
		return s
	}
	mod := n % 3
	if mod != 0 {
		buf.WriteString(s[:mod])

	}
	for i := mod; i < n; i += 3 {
		if i != 0 {
			buf.WriteString(",")
		}

		buf.WriteString(s[i : i+3])
	}
	return buf.String()
}

// 练习 3.11: 完善comma函数，以支持浮点数处理和一个可选的正负号的处理。
func comma2(s string) string {
	var buf bytes.Buffer
	if s[0] == '-' || s[0] == '+' {
		buf.WriteByte(s[0])
		s = s[1:]
	}
	// 处理浮点数
	dotIndex := strings.Index(s, ".")
	if dotIndex != -1 {
		tmp := comma1(s[:dotIndex]) + "." + comma1(s[dotIndex+1:])
		fmt.Println(tmp)
		buf.WriteString(tmp)
		return buf.String()
	}
	buf.WriteString(comma1(s))
	return buf.String()
}

// 练习 3.12: 编写一个函数，判断两个字符串是否是是相互打乱的，也就是说它们有着相同的 字符，但是对应不同的顺序。
func isShuffled(s1, s2 string) bool {
	if len(s1) != len(s2) {
		return false
	}
	m := make(map[rune]int)
	for _, r := range s1 {
		m[r]++
	}
	for _, r := range s2 {
		if i, ok := m[r]; !ok || i == 0 {
			return false
		}
		m[r]--
	}
	for _, v := range m {
		if v != 0 {
			return false
		}
	}
	return true
}
